ee817bda2e50111d4c3075a3be141585d54f0b0f,languages/baseLanguage/closures/source_gen/jetbrains/mps/baseLanguage/closures/typesystem/typeof_ClosureLiteral_InferenceRule.java,typeof_ClosureLiteral_InferenceRule,applyRule,#SNode#TypeCheckingContext#IsApplicableStatus#,41

Before Change


      {
        SNode _nodeToCheck_1029348928467 = closure;
        EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "1221663085197", 0, null);
        typeCheckingContext.createEquation((SNode) typeCheckingContext.getRepresentative(RESULT_typevar_1221579592331), (SNode) typeCheckingContext.getRepresentative(RET_AND_TERM_typevar_1232125197501), _info_12389875345);
      }
    } else {
      {

After Change


  public typeof_ClosureLiteral_InferenceRule() {
  }

  public void applyRule(final SNode closure, final TypeCheckingContext typeCheckingContext, IsApplicableStatus status) {
    List<SNode> paramTypes = ListSequence.fromList(new ArrayList<SNode>());
    for (SNode param : SLinkOperations.getTargets(closure, "parameter", true)) {
      if (SNodeOperations.isInstanceOf(SLinkOperations.getTarget(param, "type", true), "jetbrains.mps.baseLanguage.structure.WildCardType") || SNodeOperations.isInstanceOf(SLinkOperations.getTarget(param, "type", true), "jetbrains.mps.baseLanguage.structure.UndefinedType")) {
        final SNode pt_typevar_1221579075465 = typeCheckingContext.createNewRuntimeTypesVariable();
        {
          SNode _nodeToCheck_1029348928467 = param;
          EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "1221579075466", 0, null);
          typeCheckingContext.createEquation((SNode) typeCheckingContext.getRepresentative(pt_typevar_1221579075465), (SNode) typeCheckingContext.typeOf(_nodeToCheck_1029348928467, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "1221579075470", true), _info_12389875345);
        }
        ListSequence.fromList(paramTypes).addElement(typeCheckingContext.getRepresentative(pt_typevar_1221579075465));
      } else if ((SLinkOperations.getTarget(param, "type", true) != null)) {
        ListSequence.fromList(paramTypes).addElement(SLinkOperations.getTarget(param, "type", true));
      }
    }
    List<SNode> allRets = ListSequence.fromList(new ArrayList<SNode>());
    List<SNode> allYlds = ListSequence.fromList(new ArrayList<SNode>());
    List<SNode> allYldAlls = ListSequence.fromList(new ArrayList<SNode>());
    List<SNode> allStmts = ListSequence.fromList(new LinkedList<SNode>());
    List<SNode> allThrows = ListSequence.fromList(new ArrayList<SNode>());
    List<SNode> allCatches = ListSequence.fromList(new ArrayList<SNode>());
    for (SNode c : SNodeOperations.getChildren(SLinkOperations.getTarget(closure, "body", true))) {
      if (SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.structure.ReturnStatement")) {
        ListSequence.fromList(allRets).addElement(c);
      } else if (SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement")) {
        ListSequence.fromList(allYlds).addElement(c);
      } else if (SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.closures.structure.YieldAllStatement")) {
        ListSequence.fromList(allYldAlls).addElement(c);
      } else if (!(SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.structure.CommentedStatementsBlock")) && !(SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.structure.IStatementListContainer"))) {
        ListSequence.fromList(allStmts).addElement(c);
      }
    }
    while (!(ListSequence.fromList(allStmts).isEmpty())) {
      SNode stmt = ListSequence.fromList(allStmts).removeElementAt(0);
      if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.structure.ReturnStatement")) {
        ListSequence.fromList(allRets).addElement(stmt);
      } else if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement")) {
        ListSequence.fromList(allYlds).addElement(stmt);
      } else if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.closures.structure.YieldAllStatement")) {
        ListSequence.fromList(allYldAlls).addElement(stmt);
      } else
      if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement")) {
        ListSequence.fromList(allYlds).addElement(stmt);
      } else {
        if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.structure.ThrowStatement")) {
          final SNode tt_typevar_1221579075612 = typeCheckingContext.createNewRuntimeTypesVariable();
          {
            SNode _nodeToCheck_1029348928467 = SLinkOperations.getTarget(SNodeOperations.cast(stmt, "jetbrains.mps.baseLanguage.structure.ThrowStatement"), "throwable", true);
            EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "1221579075613", 0, null);
            typeCheckingContext.createEquation((SNode) typeCheckingContext.getRepresentative(tt_typevar_1221579075612), (SNode) typeCheckingContext.typeOf(_nodeToCheck_1029348928467, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "1221579075617", true), _info_12389875345);
          }
          ListSequence.fromList(allThrows).addElement(typeCheckingContext.getRepresentative(tt_typevar_1221579075612));
        } else if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.structure.TryStatement")) {
          for (SNode caught : ListSequence.fromList(SLinkOperations.getTargets(SNodeOperations.cast(stmt, "jetbrains.mps.baseLanguage.structure.TryStatement"), "catchClause", true)).where(new IWhereFilter<SNode>() {
            public boolean accept(SNode it) {
              return SNodeOperations.isInstanceOf(SLinkOperations.getTarget(SLinkOperations.getTarget(it, "throwable", true), "type", true), "jetbrains.mps.baseLanguage.structure.ClassifierType");
            }
          }).select(new ISelector<SNode, SNode>() {
            public SNode select(SNode it) {
              return SNodeOperations.as(SLinkOperations.getTarget(SLinkOperations.getTarget(it, "throwable", true), "type", true), "jetbrains.mps.baseLanguage.structure.ClassifierType");
            }
          })) {
            ListSequence.fromList(allCatches).addElement(caught);
          }
        } else if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.structure.TryCatchStatement")) {
          for (SNode caught : ListSequence.fromList(SLinkOperations.getTargets(SNodeOperations.cast(stmt, "jetbrains.mps.baseLanguage.structure.TryCatchStatement"), "catchClause", true)).where(new IWhereFilter<SNode>() {
            public boolean accept(SNode it) {
              return SNodeOperations.isInstanceOf(SLinkOperations.getTarget(SLinkOperations.getTarget(it, "throwable", true), "type", true), "jetbrains.mps.baseLanguage.structure.ClassifierType");
            }
          }).select(new ISelector<SNode, SNode>() {
            public SNode select(SNode it) {
              return SNodeOperations.as(SLinkOperations.getTarget(SLinkOperations.getTarget(it, "throwable", true), "type", true), "jetbrains.mps.baseLanguage.structure.ClassifierType");
            }
          })) {
            ListSequence.fromList(allCatches).addElement(caught);
          }
        } else {
          for (SNode thr : ListSequence.fromList(SNodeOperations.getDescendants(stmt, "jetbrains.mps.baseLanguage.structure.IMethodCall", false, new String[]{"jetbrains.mps.baseLanguage.structure.IStatementListContainer"})).translate(new ITranslator2<SNode, SNode>() {
            public Iterable<SNode> translate(SNode it) {
              return IMethodLike_Behavior.call_getThrowableTypes_6204026822016975623(SLinkOperations.getTarget(it, "baseMethodDeclaration", false));
            }
          })) {
            ListSequence.fromList(allThrows).addElement(SNodeOperations.copyNode(thr));
          }
        }
        List<SNode> allChildren = ListSequence.fromList(new LinkedList<SNode>());
        ListSequence.fromList(allChildren).addSequence(ListSequence.fromList(SNodeOperations.getChildren(stmt)));
        while (ListSequence.fromList(allChildren).isNotEmpty()) {
          SNode c = ListSequence.fromList(allChildren).removeElementAt(0);
          if (SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.structure.StatementList")) {
            for (SNode cstmt : SLinkOperations.getTargets(SNodeOperations.cast(c, "jetbrains.mps.baseLanguage.structure.StatementList"), "statement", true)) {
              if (!(SNodeOperations.isInstanceOf(cstmt, "jetbrains.mps.baseLanguage.structure.CommentedStatementsBlock")) && !(SNodeOperations.isInstanceOf(cstmt, "jetbrains.mps.baseLanguage.structure.IStatementListContainer"))) {
                ListSequence.fromList(allStmts).addElement(cstmt);
              }
            }
          } else if (!(SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.structure.IStatementListContainer"))) {
            ListSequence.fromList(allChildren).addSequence(ListSequence.fromList(SNodeOperations.getChildren(c)));
          }
        }
      }
    }
    List<SNode> realThrows = ListSequence.fromList(new ArrayList<SNode>());
with_allThrows:
    for (SNode another : allThrows) {
      if (SNodeOperations.isInstanceOf(another, "jetbrains.mps.baseLanguage.structure.ClassifierType")) {
        for (SNode one : realThrows) {
          if (SNodeOperations.isInstanceOf(one, "jetbrains.mps.baseLanguage.structure.ClassifierType") && (SLinkOperations.getTarget(SNodeOperations.cast(one, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false) == SLinkOperations.getTarget(SNodeOperations.cast(another, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false)) || Classifier_Behavior.call_isDescendant_7165541881557222913(SLinkOperations.getTarget(SNodeOperations.cast(another, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false), SLinkOperations.getTarget(SNodeOperations.cast(one, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false))) {
            continue with_allThrows;
          }
          if (MatchingUtil.matchNodes(one, another)) {
            continue with_allThrows;
          }
        }
        for (SNode caught : allCatches) {
          if (SNodeOperations.isInstanceOf(caught, "jetbrains.mps.baseLanguage.structure.ClassifierType") && (SLinkOperations.getTarget(SNodeOperations.cast(caught, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false) == SLinkOperations.getTarget(SNodeOperations.cast(another, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false) || Classifier_Behavior.call_isDescendant_7165541881557222913(SLinkOperations.getTarget(SNodeOperations.cast(another, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false), SLinkOperations.getTarget(SNodeOperations.cast(caught, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false)))) {
            continue with_allThrows;
          }
          if (MatchingUtil.matchNodes(caught, another)) {
            continue with_allThrows;
          }
        }
      }
      ListSequence.fromList(realThrows).addElement(another);
    }
    final SNode RLCS_typevar_1221579075692 = typeCheckingContext.createNewRuntimeTypesVariable();
    boolean isVoid = false;
    for (SNode rs : allRets) {
      if (SNodeOperations.isInstanceOf(SLinkOperations.getTarget(SNodeOperations.cast(rs, "jetbrains.mps.baseLanguage.structure.ReturnStatement"), "expression", true), "jetbrains.mps.baseLanguage.structure.NullLiteral")) {
        {
          SNode _nodeToCheck_1029348928467 = closure;
          EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "3294521177951941138", 0, null);
          typeCheckingContext.createGreaterThanInequality((SNode) typeCheckingContext.getRepresentative(RLCS_typevar_1221579075692), (SNode) new typeof_ClosureLiteral_InferenceRule.QuotationClass_nx7618_a0a0a0a41a0().createNode(typeCheckingContext), false, true, _info_12389875345);
        }
      } else {
        SNode retExpression = SLinkOperations.getTarget(SNodeOperations.cast(rs, "jetbrains.mps.baseLanguage.structure.ReturnStatement"), "expression", true);
        if (retExpression == null) {
          {
            SNode _nodeToCheck_1029348928467 = closure;
            EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "7668447476859502248", 0, null);
            typeCheckingContext.createGreaterThanInequality((SNode) typeCheckingContext.getRepresentative(RLCS_typevar_1221579075692), (SNode) new typeof_ClosureLiteral_InferenceRule.QuotationClass_nx7618_a0a0a1a0a0o0a().createNode(typeCheckingContext), false, true, _info_12389875345);
          }
          isVoid = true;
        } else {
          {
            SNode _nodeToCheck_1029348928467 = retExpression;
            EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "5604339164783014263", 0, null);
            typeCheckingContext.createGreaterThanInequality((SNode) typeCheckingContext.getRepresentative(RLCS_typevar_1221579075692), (SNode) typeCheckingContext.typeOf(_nodeToCheck_1029348928467, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "5604339164783014269", true), false, true, _info_12389875345);
          }
        }
      }
    }
    final SNode YLCS_typevar_1221579075693 = typeCheckingContext.createNewRuntimeTypesVariable();
    for (SNode ys : allYlds) {
      if (SNodeOperations.isInstanceOf(SLinkOperations.getTarget(SNodeOperations.cast(ys, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement"), "expression", true), "jetbrains.mps.baseLanguage.structure.NullLiteral")) {
        {
          SNode _nodeToCheck_1029348928467 = closure;
          EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "7668447476859502122", 0, null);
          typeCheckingContext.createGreaterThanInequality((SNode) typeCheckingContext.getRepresentative(YLCS_typevar_1221579075693), (SNode) new typeof_ClosureLiteral_InferenceRule.QuotationClass_nx7618_a0a0a0a61a0().createNode(typeCheckingContext), false, true, _info_12389875345);
        }
      } else {
        {
          SNode _nodeToCheck_1029348928467 = SLinkOperations.getTarget(SNodeOperations.cast(ys, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement"), "expression", true);
          EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "7668447476859502152", 0, null);
          typeCheckingContext.createGreaterThanInequality((SNode) typeCheckingContext.getRepresentative(YLCS_typevar_1221579075693), (SNode) typeCheckingContext.typeOf(_nodeToCheck_1029348928467, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "7668447476859502170", true), false, true, _info_12389875345);
        }
      }
    }